/*
 * Copyright (c) 2021 Bitdefender
 * SPDX-License-Identifier: Apache-2.0
 */
//! Instruction sets.

/// ISA set.
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[allow(non_camel_case_types)]
pub enum IsaSet {
    I3DNOW,
    ADX,
    AES,
    AMD,
    AMXAVX512,
    AMXBF16,
    AMXCOMPLEX,
    AMXFP16,
    AMXFP8,
    AMXINT8,
    AMXMOVRS,
    AMXTF32,
    AMXTILE,
    AMXTRANSPOSE,
    APX_F,
    AVX,
    AVX102,
    AVX2,
    AVX2GATHER,
    AVX5124FMAPS,
    AVX5124VNNIW,
    AVX512BF16,
    AVX512BITALG,
    AVX512BW,
    AVX512CD,
    AVX512DQ,
    AVX512ER,
    AVX512F,
    AVX512FP16,
    AVX512IFMA,
    AVX512PF,
    AVX512VBMI,
    AVX512VBMI2,
    AVX512VNNI,
    AVX512VP2INTERSECT,
    AVX512VPOPCNTDQ,
    AVXIFMA,
    AVXNECONVERT,
    AVXVNNI,
    AVXVNNIINT16,
    AVXVNNIINT8,
    BHI_DIS_S,
    BMI1,
    BMI2,
    CET_IBT,
    CET_SS,
    CLDEMOTE,
    CLFSH,
    CLFSHOPT,
    CLWB,
    CLZERO,
    CMPCCXADD,
    CMPXCHG16B,
    ENQCMD,
    F16C,
    FMA,
    FMA4,
    FRED,
    FXSAVE,
    GFNI,
    HRESET,
    I186,
    I286PROT,
    I286REAL,
    I386,
    I486,
    I486REAL,
    I86,
    INVLPGB,
    INVPCID,
    KL,
    LKGS,
    LONGMODE,
    LWP,
    LZCNT,
    MCOMMIT,
    MMX,
    MOVBE,
    MOVDIR64B,
    MOVDIRI,
    MOVRS,
    MPX,
    MSRLIST,
    MSR_IMM,
    MWAITT,
    PAUSE,
    PCLMULQDQ,
    PCONFIG,
    PENTIUMREAL,
    PKU,
    POPCNT,
    PPRO,
    PREFETCHITI,
    PREFETCH_NOP,
    PTWRITE,
    RAOINT,
    RDPID,
    RDPMC,
    RDPRU,
    RDRAND,
    RDSEED,
    RDTSCP,
    RDWRFSGS,
    SERIALIZE,
    SGX,
    SHA,
    SHA512,
    SM3,
    SM4,
    SMAP,
    SMX,
    SNP,
    SSE,
    SSE2,
    SSE3,
    SSE4,
    SSE42,
    SSE4A,
    SSSE3,
    SVM,
    TBM,
    TDX,
    TSE,
    TSX,
    TSXLDTRK,
    UD,
    UINTR,
    UNKNOWN,
    USER_MSR,
    VAES,
    VPCLMULQDQ,
    VTX,
    WAITPKG,
    WBNOINVD,
    WRMSRNS,
    X87,
    XOP,
    XSAVE,
    XSAVEC,
    XSAVES,
}

#[doc(hidden)]
impl IsaSet {
    #[allow(clippy::too_many_lines)]
    pub(crate) fn from_raw(value: ffi::ND_INS_SET) -> Option<Self> {
        match value {
            ffi::_ND_INS_SET::ND_SET_INVALID => None,
            ffi::_ND_INS_SET::ND_SET_3DNOW => Some(IsaSet::I3DNOW),
            ffi::_ND_INS_SET::ND_SET_ADX => Some(IsaSet::ADX),
            ffi::_ND_INS_SET::ND_SET_AES => Some(IsaSet::AES),
            ffi::_ND_INS_SET::ND_SET_AMD => Some(IsaSet::AMD),
            ffi::_ND_INS_SET::ND_SET_AMXAVX512 => Some(IsaSet::AMXAVX512),
            ffi::_ND_INS_SET::ND_SET_AMXBF16 => Some(IsaSet::AMXBF16),
            ffi::_ND_INS_SET::ND_SET_AMXCOMPLEX => Some(IsaSet::AMXCOMPLEX),
            ffi::_ND_INS_SET::ND_SET_AMXFP16 => Some(IsaSet::AMXFP16),
            ffi::_ND_INS_SET::ND_SET_AMXFP8 => Some(IsaSet::AMXFP8),
            ffi::_ND_INS_SET::ND_SET_AMXINT8 => Some(IsaSet::AMXINT8),
            ffi::_ND_INS_SET::ND_SET_AMXMOVRS => Some(IsaSet::AMXMOVRS),
            ffi::_ND_INS_SET::ND_SET_AMXTF32 => Some(IsaSet::AMXTF32),
            ffi::_ND_INS_SET::ND_SET_AMXTILE => Some(IsaSet::AMXTILE),
            ffi::_ND_INS_SET::ND_SET_AMXTRANSPOSE => Some(IsaSet::AMXTRANSPOSE),
            ffi::_ND_INS_SET::ND_SET_APX_F => Some(IsaSet::APX_F),
            ffi::_ND_INS_SET::ND_SET_AVX => Some(IsaSet::AVX),
            ffi::_ND_INS_SET::ND_SET_AVX102 => Some(IsaSet::AVX102),
            ffi::_ND_INS_SET::ND_SET_AVX2 => Some(IsaSet::AVX2),
            ffi::_ND_INS_SET::ND_SET_AVX2GATHER => Some(IsaSet::AVX2GATHER),
            ffi::_ND_INS_SET::ND_SET_AVX5124FMAPS => Some(IsaSet::AVX5124FMAPS),
            ffi::_ND_INS_SET::ND_SET_AVX5124VNNIW => Some(IsaSet::AVX5124VNNIW),
            ffi::_ND_INS_SET::ND_SET_AVX512BF16 => Some(IsaSet::AVX512BF16),
            ffi::_ND_INS_SET::ND_SET_AVX512BITALG => Some(IsaSet::AVX512BITALG),
            ffi::_ND_INS_SET::ND_SET_AVX512BW => Some(IsaSet::AVX512BW),
            ffi::_ND_INS_SET::ND_SET_AVX512CD => Some(IsaSet::AVX512CD),
            ffi::_ND_INS_SET::ND_SET_AVX512DQ => Some(IsaSet::AVX512DQ),
            ffi::_ND_INS_SET::ND_SET_AVX512ER => Some(IsaSet::AVX512ER),
            ffi::_ND_INS_SET::ND_SET_AVX512F => Some(IsaSet::AVX512F),
            ffi::_ND_INS_SET::ND_SET_AVX512FP16 => Some(IsaSet::AVX512FP16),
            ffi::_ND_INS_SET::ND_SET_AVX512IFMA => Some(IsaSet::AVX512IFMA),
            ffi::_ND_INS_SET::ND_SET_AVX512PF => Some(IsaSet::AVX512PF),
            ffi::_ND_INS_SET::ND_SET_AVX512VBMI => Some(IsaSet::AVX512VBMI),
            ffi::_ND_INS_SET::ND_SET_AVX512VBMI2 => Some(IsaSet::AVX512VBMI2),
            ffi::_ND_INS_SET::ND_SET_AVX512VNNI => Some(IsaSet::AVX512VNNI),
            ffi::_ND_INS_SET::ND_SET_AVX512VP2INTERSECT => Some(IsaSet::AVX512VP2INTERSECT),
            ffi::_ND_INS_SET::ND_SET_AVX512VPOPCNTDQ => Some(IsaSet::AVX512VPOPCNTDQ),
            ffi::_ND_INS_SET::ND_SET_AVXIFMA => Some(IsaSet::AVXIFMA),
            ffi::_ND_INS_SET::ND_SET_AVXNECONVERT => Some(IsaSet::AVXNECONVERT),
            ffi::_ND_INS_SET::ND_SET_AVXVNNI => Some(IsaSet::AVXVNNI),
            ffi::_ND_INS_SET::ND_SET_AVXVNNIINT16 => Some(IsaSet::AVXVNNIINT16),
            ffi::_ND_INS_SET::ND_SET_AVXVNNIINT8 => Some(IsaSet::AVXVNNIINT8),
            ffi::_ND_INS_SET::ND_SET_BHI_DIS_S => Some(IsaSet::BHI_DIS_S),
            ffi::_ND_INS_SET::ND_SET_BMI1 => Some(IsaSet::BMI1),
            ffi::_ND_INS_SET::ND_SET_BMI2 => Some(IsaSet::BMI2),
            ffi::_ND_INS_SET::ND_SET_CET_IBT => Some(IsaSet::CET_IBT),
            ffi::_ND_INS_SET::ND_SET_CET_SS => Some(IsaSet::CET_SS),
            ffi::_ND_INS_SET::ND_SET_CLDEMOTE => Some(IsaSet::CLDEMOTE),
            ffi::_ND_INS_SET::ND_SET_CLFSH => Some(IsaSet::CLFSH),
            ffi::_ND_INS_SET::ND_SET_CLFSHOPT => Some(IsaSet::CLFSHOPT),
            ffi::_ND_INS_SET::ND_SET_CLWB => Some(IsaSet::CLWB),
            ffi::_ND_INS_SET::ND_SET_CLZERO => Some(IsaSet::CLZERO),
            ffi::_ND_INS_SET::ND_SET_CMPCCXADD => Some(IsaSet::CMPCCXADD),
            ffi::_ND_INS_SET::ND_SET_CMPXCHG16B => Some(IsaSet::CMPXCHG16B),
            ffi::_ND_INS_SET::ND_SET_ENQCMD => Some(IsaSet::ENQCMD),
            ffi::_ND_INS_SET::ND_SET_F16C => Some(IsaSet::F16C),
            ffi::_ND_INS_SET::ND_SET_FMA => Some(IsaSet::FMA),
            ffi::_ND_INS_SET::ND_SET_FMA4 => Some(IsaSet::FMA4),
            ffi::_ND_INS_SET::ND_SET_FRED => Some(IsaSet::FRED),
            ffi::_ND_INS_SET::ND_SET_FXSAVE => Some(IsaSet::FXSAVE),
            ffi::_ND_INS_SET::ND_SET_GFNI => Some(IsaSet::GFNI),
            ffi::_ND_INS_SET::ND_SET_HRESET => Some(IsaSet::HRESET),
            ffi::_ND_INS_SET::ND_SET_I186 => Some(IsaSet::I186),
            ffi::_ND_INS_SET::ND_SET_I286PROT => Some(IsaSet::I286PROT),
            ffi::_ND_INS_SET::ND_SET_I286REAL => Some(IsaSet::I286REAL),
            ffi::_ND_INS_SET::ND_SET_I386 => Some(IsaSet::I386),
            ffi::_ND_INS_SET::ND_SET_I486 => Some(IsaSet::I486),
            ffi::_ND_INS_SET::ND_SET_I486REAL => Some(IsaSet::I486REAL),
            ffi::_ND_INS_SET::ND_SET_I86 => Some(IsaSet::I86),
            ffi::_ND_INS_SET::ND_SET_INVLPGB => Some(IsaSet::INVLPGB),
            ffi::_ND_INS_SET::ND_SET_INVPCID => Some(IsaSet::INVPCID),
            ffi::_ND_INS_SET::ND_SET_KL => Some(IsaSet::KL),
            ffi::_ND_INS_SET::ND_SET_LKGS => Some(IsaSet::LKGS),
            ffi::_ND_INS_SET::ND_SET_LONGMODE => Some(IsaSet::LONGMODE),
            ffi::_ND_INS_SET::ND_SET_LWP => Some(IsaSet::LWP),
            ffi::_ND_INS_SET::ND_SET_LZCNT => Some(IsaSet::LZCNT),
            ffi::_ND_INS_SET::ND_SET_MCOMMIT => Some(IsaSet::MCOMMIT),
            ffi::_ND_INS_SET::ND_SET_MMX => Some(IsaSet::MMX),
            ffi::_ND_INS_SET::ND_SET_MOVBE => Some(IsaSet::MOVBE),
            ffi::_ND_INS_SET::ND_SET_MOVDIR64B => Some(IsaSet::MOVDIR64B),
            ffi::_ND_INS_SET::ND_SET_MOVDIRI => Some(IsaSet::MOVDIRI),
            ffi::_ND_INS_SET::ND_SET_MOVRS => Some(IsaSet::MOVRS),
            ffi::_ND_INS_SET::ND_SET_MPX => Some(IsaSet::MPX),
            ffi::_ND_INS_SET::ND_SET_MSRLIST => Some(IsaSet::MSRLIST),
            ffi::_ND_INS_SET::ND_SET_MSR_IMM => Some(IsaSet::MSR_IMM),
            ffi::_ND_INS_SET::ND_SET_MWAITT => Some(IsaSet::MWAITT),
            ffi::_ND_INS_SET::ND_SET_PAUSE => Some(IsaSet::PAUSE),
            ffi::_ND_INS_SET::ND_SET_PCLMULQDQ => Some(IsaSet::PCLMULQDQ),
            ffi::_ND_INS_SET::ND_SET_PCONFIG => Some(IsaSet::PCONFIG),
            ffi::_ND_INS_SET::ND_SET_PENTIUMREAL => Some(IsaSet::PENTIUMREAL),
            ffi::_ND_INS_SET::ND_SET_PKU => Some(IsaSet::PKU),
            ffi::_ND_INS_SET::ND_SET_POPCNT => Some(IsaSet::POPCNT),
            ffi::_ND_INS_SET::ND_SET_PPRO => Some(IsaSet::PPRO),
            ffi::_ND_INS_SET::ND_SET_PREFETCHITI => Some(IsaSet::PREFETCHITI),
            ffi::_ND_INS_SET::ND_SET_PREFETCH_NOP => Some(IsaSet::PREFETCH_NOP),
            ffi::_ND_INS_SET::ND_SET_PTWRITE => Some(IsaSet::PTWRITE),
            ffi::_ND_INS_SET::ND_SET_RAOINT => Some(IsaSet::RAOINT),
            ffi::_ND_INS_SET::ND_SET_RDPID => Some(IsaSet::RDPID),
            ffi::_ND_INS_SET::ND_SET_RDPMC => Some(IsaSet::RDPMC),
            ffi::_ND_INS_SET::ND_SET_RDPRU => Some(IsaSet::RDPRU),
            ffi::_ND_INS_SET::ND_SET_RDRAND => Some(IsaSet::RDRAND),
            ffi::_ND_INS_SET::ND_SET_RDSEED => Some(IsaSet::RDSEED),
            ffi::_ND_INS_SET::ND_SET_RDTSCP => Some(IsaSet::RDTSCP),
            ffi::_ND_INS_SET::ND_SET_RDWRFSGS => Some(IsaSet::RDWRFSGS),
            ffi::_ND_INS_SET::ND_SET_SERIALIZE => Some(IsaSet::SERIALIZE),
            ffi::_ND_INS_SET::ND_SET_SGX => Some(IsaSet::SGX),
            ffi::_ND_INS_SET::ND_SET_SHA => Some(IsaSet::SHA),
            ffi::_ND_INS_SET::ND_SET_SHA512 => Some(IsaSet::SHA512),
            ffi::_ND_INS_SET::ND_SET_SM3 => Some(IsaSet::SM3),
            ffi::_ND_INS_SET::ND_SET_SM4 => Some(IsaSet::SM4),
            ffi::_ND_INS_SET::ND_SET_SMAP => Some(IsaSet::SMAP),
            ffi::_ND_INS_SET::ND_SET_SMX => Some(IsaSet::SMX),
            ffi::_ND_INS_SET::ND_SET_SNP => Some(IsaSet::SNP),
            ffi::_ND_INS_SET::ND_SET_SSE => Some(IsaSet::SSE),
            ffi::_ND_INS_SET::ND_SET_SSE2 => Some(IsaSet::SSE2),
            ffi::_ND_INS_SET::ND_SET_SSE3 => Some(IsaSet::SSE3),
            ffi::_ND_INS_SET::ND_SET_SSE4 => Some(IsaSet::SSE4),
            ffi::_ND_INS_SET::ND_SET_SSE42 => Some(IsaSet::SSE42),
            ffi::_ND_INS_SET::ND_SET_SSE4A => Some(IsaSet::SSE4A),
            ffi::_ND_INS_SET::ND_SET_SSSE3 => Some(IsaSet::SSSE3),
            ffi::_ND_INS_SET::ND_SET_SVM => Some(IsaSet::SVM),
            ffi::_ND_INS_SET::ND_SET_TBM => Some(IsaSet::TBM),
            ffi::_ND_INS_SET::ND_SET_TDX => Some(IsaSet::TDX),
            ffi::_ND_INS_SET::ND_SET_TSE => Some(IsaSet::TSE),
            ffi::_ND_INS_SET::ND_SET_TSX => Some(IsaSet::TSX),
            ffi::_ND_INS_SET::ND_SET_TSXLDTRK => Some(IsaSet::TSXLDTRK),
            ffi::_ND_INS_SET::ND_SET_UD => Some(IsaSet::UD),
            ffi::_ND_INS_SET::ND_SET_UINTR => Some(IsaSet::UINTR),
            ffi::_ND_INS_SET::ND_SET_UNKNOWN => Some(IsaSet::UNKNOWN),
            ffi::_ND_INS_SET::ND_SET_USER_MSR => Some(IsaSet::USER_MSR),
            ffi::_ND_INS_SET::ND_SET_VAES => Some(IsaSet::VAES),
            ffi::_ND_INS_SET::ND_SET_VPCLMULQDQ => Some(IsaSet::VPCLMULQDQ),
            ffi::_ND_INS_SET::ND_SET_VTX => Some(IsaSet::VTX),
            ffi::_ND_INS_SET::ND_SET_WAITPKG => Some(IsaSet::WAITPKG),
            ffi::_ND_INS_SET::ND_SET_WBNOINVD => Some(IsaSet::WBNOINVD),
            ffi::_ND_INS_SET::ND_SET_WRMSRNS => Some(IsaSet::WRMSRNS),
            ffi::_ND_INS_SET::ND_SET_X87 => Some(IsaSet::X87),
            ffi::_ND_INS_SET::ND_SET_XOP => Some(IsaSet::XOP),
            ffi::_ND_INS_SET::ND_SET_XSAVE => Some(IsaSet::XSAVE),
            ffi::_ND_INS_SET::ND_SET_XSAVEC => Some(IsaSet::XSAVEC),
            ffi::_ND_INS_SET::ND_SET_XSAVES => Some(IsaSet::XSAVES),
        }
    }
}
